package org.huangrui.spark.scala.core.rdd.operate.transform

import org.apache.spark.{SparkConf, SparkContext}

/**
 * @Author hr
 * @Create 2024-10-17 19:49
 */
object Spark13_Operate_Transform_KV_sortByKey_1 {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local[*]").setAppName("spark")
    val sc = new SparkContext(conf)
    val user = new User(30, 2000)
    val user1 = new User(40, 3000)
    val user2 = new User(30, 3000)
    val user3 = new User(40, 2500)
    val tuples = List((user, 1), (user1, 3), (user2, 4), (user3, 2))
    // TODO sortByKey方法
    //      groupByKey  : 按照 K 对 V 进行分组
    //      reduceByKey : 按照 K 对 V 进行两两聚合
    //      sortByKey   : 按照 K 排序
    sc.parallelize(tuples,2).sortByKey().collect().foreach(println)

    sc.stop()
  }
}
class User(val age: Int,val amount:Int) extends Comparable[User] with Serializable {
  // 方法返回值为整型数据，表示数据比较结果（状态）
  // 如果为大于0的整数，那么表示当前对象比其他的对象大
  // 如果为小于0的整数，那么表示当前对象比其他的对象小
  // 如果等于0，那么表示当前对象和其他的对象一样大
  override def compareTo(o: User): Int = {
    if (this.age.compareTo(o.age) == 0) {
      println(s"age相同，amount进行排序 - this.amount.compareTo(o.amount) = ${this.amount.compareTo(o.amount)} 计算结果 = ${-this.amount.compareTo(o.amount)}")
      -this.amount.compareTo(o.amount)
    }
    this.age.compareTo(o.age)
  }

  override def toString: String = {
    s"User(age=$age, amount=$amount)"
  }
}